#####################################################
#####################################################
## Seminář o práci v R Studiu - Část druhá
## 
## Vizualizace
#####################################################
#####################################################

# Program:
# 1. Manipulace s datovými sety
# 2. Histogramy
# 3. Bodové grafy
# 4. ggplot2
# 5. Další možná zobrazení





###################################################
## 1. Manipulace s datovými sety
###################################################

# Je vhodné mít vytvořenou zvláštní složku na import dat - zde jsou vloženy původní datasety.

# Import datového setu s kandidáty v senátních volbách.
# zdroj: https://volby.cz/opendata/se2018/se2018_opendata.htm
install.packages("readxl")
library(readxl)
serk <- as.data.frame(read_excel("data/serk.xlsx", sheet = 1))
dim(serk) # dataset má 237 řádků (pozorování - N) a 26 sloupců (proměnných)
colnames(serk)
head(serk)

# Důležité je podívat se na kódovací knihu a pracovat s ní.

# Většinu původních datasetů je třeba nejprve vyčistit.

serk <- serk[serk$PLATNOST=="A",] # u seznamu kandidátů je typicky nutné odstranit ty neplatné

# Kombinace více datových setů:
cns <- read_excel("data/SE2018ciselnik20181004/cns.xlsx", sheet = 1)
colnames(cns)
serk <- merge(x = serk, y = cns[,c("NSTRANA","ZKRATKAN8")], by = "NSTRANA") # propojení datových setů
cpp <- read_excel("data/SE2018ciselnik20181004/cpp.xlsx", sheet = 1)
colnames(cpp)
serk <- merge(x = serk, y = cpp[,c("PSTRANA","ZKRATKAP8")], by = "PSTRANA") # propojení datových setů
head(serk)

# Dataset je možné dále třídit a vytvářet menší datové sety:

serk_o2 <- serk[serk$OBVOD==2,]
serk_vek <- serk[,c("JMENO","PRIJMENI","VEK")]



###################################################
##  Cvičení I: Výběr kandidátů.
#   a) Vytvořte objekt "data" - dataset kandidátů, 
#      kteří postoupili do 2. kola, navrhla je ODS a je jim více než 50 let.





data <- serk[serk$PROC_K2 > 0 & serk$ZKRATKAN8=="ODS" & serk$VEK>50,]



###################################################
## 2. Histogramy
###################################################

rm(serk_vek,serk_o2,data)

# Funkce pro zakreslení histogramu:
help(hist)
hist(serk$VEK)

# Určitě by to ale šlo udělat hezčím způsobem:
hist(x = serk$VEK, 
     main = "Vek kandidatu na senatora", xlab = "Vek", ylab = "Frekvence",
     col = "forestgreen")
# http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf paleta barev v R

# Další atributy histogramu:
hist(x = serk$VEK, 
     main = "Vek kandidatu na senatora", xlab = "Vek", ylab = "Frekvence",
     col = "forestgreen", 
     breaks = 20, ylim = c(0,40), xlim = c(40,100), labels = T)

# Export jakéhokoliv grafu:
pdf("export/histogram_vek.pdf", width = 10, height = 5)
hist(serk$VEK, 
     main = "Vek kandidatu na senatora", xlab = "Vek", ylab = "Frekvence",
     col = "forestgreen", 
     breaks = 20, ylim = c(0,25), xlim = c(40,80), labels = T)
dev.off() # zakončuje zapisování grafu a ruší veškeré grafické nastavení

# Exportovat je možné v různých formátech - jpeg, bmp, tiff apod.



###################################################
## 3. Bodové grafy
###################################################

# Využijeme generickou funkci "plot".
# Podívejme se na zakreslení věku kandidátů a jejich procentuálních zisků v 1. kole:
plot(x = serk$VEK, y = serk$PROC_K1)

# Graf opět trochu zkrášlíme:
plot(x = serk$VEK, y = serk$PROC_K1, 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu")

# Důležitá vlastnost je možná změna podoby bodů:
plot(x = serk$VEK, y = serk$PROC_K1, 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu", 
     pch = 16, cex = 1, col = "red")
# http://www.sthda.com/english/wiki/r-plot-pch-symbols-the-different-point-shapes-available-in-r symboly

# Přidat můžeme hranici znázorňující zisk mandátu už v 1. kole:
help(abline)
abline(h = 50)

plot(serk$VEK,serk$PROC_K1, 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu", 
     pch = 16, cex = 1, col = "red")
abline(h = 50, lt = "dashed", lw = 3) # i linie lze zakreslit podle konkrétní potřeby

# Přidáme ještě popisek této přímky:
help(text)
text(x = 45, y = 50,
     labels = "Zisk mandatu v 1. kole", pos = 3)


###################################################
##  Cvičení II: Zobrazení věkového průměru kandidátů.
#   a) Do grafu přidejte vertikální přímku znázorňující věkový průměr kandidátů.
#   b) Zakreslete ji modře a tečkovaně.
#   c) Přidejte textový popisek.





abline(v=mean(serk$VEK), col = "blue", lty = "dotted", lw = 3)
text(x = mean(serk$VEK), y = 45, labels = "Vekovy prumer kandidatu", pos = 4, col = "blue")



# Přidat je možné třeba i specifický bod:
help(points)
points(x = 75, y = 40, pch = 4, cex = 2)

# Můžeme samozřejmě zobrazit jenom část bodů:
plot(serk$VEK[serk$ZKRATKAN8=="ODS"],serk$PROC_K1[serk$ZKRATKAN8=="ODS"], 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu ODS", 
     pch = 16, cex = 1, col = "darkblue")

# Do grafu je možné přidat popisky:
text(serk$VEK[serk$ZKRATKAN8=="ODS"], serk$PROC_K1[serk$ZKRATKAN8=="ODS"],
     labels = serk$PRIJMENI[serk$ZKRATKAN8=="ODS"], pos = 3)

# Při vhodných příležitostech do grafů náleží legenda.
plot(serk$VEK[serk$ZKRATKAN8=="ODS"],serk$PROC_K1[serk$ZKRATKAN8=="ODS"], 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu ODS", 
     pch = 16, cex = 1, col = "darkblue")
abline(h = mean(serk$PROC_K1[serk$ZKRATKAN8=="ODS"]), col = "blue", lwd = 3, lty = "dashed")
help(legend)
legend("topleft", legend=c("Kandidati ODS", "Prumerny zisk"),
       col=c("darkblue", "blue"), lty=c(NA,"dashed"), lwd = 3, pch = c(16,NA), cex=0.8)

# Exportujme nyní srovnání ODS a ČSSD:
pdf("export/body_ods_cssd.pdf", width = 10, height = 5)
par(mfrow=c(1,2)) # tento příkaz rozděluje zakreslovací plochu do několika polí (počet řádků a sloupců)
plot(serk$VEK[serk$ZKRATKAN8=="ODS"],serk$PROC_K1[serk$ZKRATKAN8=="ODS"], 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu ODS", 
     pch = 16, cex = 1, col = "darkblue")
plot(serk$VEK[serk$ZKRATKAN8=="ČSSD"],serk$PROC_K1[serk$ZKRATKAN8=="ČSSD"], 
     xlab = "Vek", ylab = "Zisk v 1. kole (%)",
     main = "Vek a zisky senatorskych kandidatu CSSD", 
     pch = 16, cex = 1, col = "darkorange")
dev.off()

# Pozor na srovnání obou grafů - může být zavádějící...



###################################################
## 4. ggplot2
###################################################

# Pro vizualizace je možné využít i balík ggplot2.
# Pomůckou může být například: https://ggplot2.tidyverse.org 
# Někdo preferuje klasický způsob zobrazení, někdo naopak ggplot2 - oba způsoby jsou rovnocenné.

install.packages("ggplot2")
library(ggplot2)

ggplot(serk, aes(x=VEK, y=PROC_K1)) +
        geom_point(size=2, shape=23) + 
        labs(title="Ukázka ggplot2", x="Věk", y = "Zisk v 1. kole (%)")



###################################################
## 5. Další možná zobrazení
###################################################

# Koláčové grafy.
help(piechart)

# Liniové grafy:
dny <- c(1:30) # počet dní měření
pruzkumy <- rnorm(n = 30, mean = 35, sd = 4) # náhodný výběr 30 měření

plot(x = dny, y = pruzkumy,
     xlab = "Den", ylab = "Volebni preference",
     type = "o", col = "darkviolet", lwd = 2, lty = "dashed")
text(x = dny, y = pruzkumy,
     labels = round(pruzkumy,1), pos = 4)

# a mnohá další...








